#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 1207 // 定义客户端连接的端口号

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP socket
    struct sockaddr_in serv_addr; // 定义 sockaddr_in 结构用于存储服务器地址信息

    serv_addr.sin_family = AF_INET; // 设置地址族为IPv4
    serv_addr.sin_port = htons(PORT); // 设置服务器端口，并转换为网络字节序
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { // 将点分十进制转换为网络字节序
        std::cerr << "Invalid address/ Address not supported" << std::endl;
        return 1;
    }

    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { // 连接到服务器
        std::cerr << "Connection Failed" << std::endl;
        return 1;
    }

    char buffer[1024] = {0}; // 定义一个缓冲区用于存储发送和接收的数据
    while (true) { // 无限循环，持续发送和接收消息
        std::cout << "Enter message: ";
        std::cin.getline(buffer, sizeof(buffer)); // 从标准输入读取一行文本
        send(sock, buffer, strlen(buffer), 0); // 发送消息到服务器

        int read_size = read(sock, buffer, sizeof(buffer) - 1); // 从socket读取数据
        if (read_size <= 0) break; // 如果读取失败或连接关闭，则退出循环

        buffer[read_size] = '\0'; // 确保字符串以null字符结尾
        std::cout << "Server: " << buffer << std::endl; // 输出从服务器接收的消息
    }

    close(sock); // 关闭socket
    return 0;
}
